#pragma once

#include <alibabacloud/oss/OssClient.h>
#include <mutex>
#include <memory>
#include <string>

using std::shared_ptr;
using std::string;

// OssManage 类：阿里云Oss 客户端的单例封装
class OssManage
{
public:
    // 获取单例实例-全局唯一OssManage对象
    static OssManage *get_instance();

    // 销毁单例实例，释放资源
    static void destroy_instance();

    // 上传文件到OSS（本地文件-OSS对象）
    bool upload_object(const string &bucket, // OSS存储空间名称
                       const string &object, // OSS 对象
                       const string &file);  // 本地文件路径

    // 上传内存流道OSS 内存内容-OSS对象
    bool upload_object(const string &bucket,
                       const string &object,
                       shared_ptr<std::iostream> content); // 文件流内容

    ~OssManage() {} // 析构函数

private:
    // 构造函数私有化，防止外部通过new创建对象
    OssManage();

    // 禁止拷贝构造函数，保证单例唯一性
    OssManage(const OssManage &) = delete;
    // 禁止赋值运算符重载，保证唯一性
    OssManage &operator=(const OssManage &) = delete;

private:
    // 静态成员：保存全局唯一实例
    static OssManage *instance;
    // 互斥锁：保证多线程环境下创建实例时的线程安全
    static std::mutex m_mutex;
    // 阿里云 Oss 客户端对象-智能指针，自动释放内存
    std::unique_ptr<AlibabaCloud::OSS::OssClient> m_client;
};